package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

/**
 * @description: 成员内部类的概述
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 *
 * 成员内部类: 成员内部类是最普通的内部类，它定义在另一个类的成员位置,可以看成该类的一个成员
 * 语法:
 *   [访问权限修饰符] class EnclosedClazz{ //外围（普通）类的访问权限修饰符，只有两个，public和缺省
 *   	[访问权限修饰符] class InnerClazz{//内部类访问权限修饰符，有四个，和普通成员一样
 *       }
 *   }
 *
 * 在理解成员内部类的成员特点之前,我们先要明确两点:
 *      1,成员内部类的类加载时机
 *          类加载时机: 类加载是"懒"加载,必须要加载才会加载,所以把一定会触发类加载的场景称之为"类加载的时机"
 *              a,启动main方法
 *              b,new对象
 *              c,访问静态成员
 *              d,触发子类类加载会先类加载父类(这里先不考虑)
 *          目前看来,成员内部类的类加载主要靠创建成员内部类对象触发
 *      2,怎么创建成员内部类对象?
 *          因为成员内部类已经看成外围类的成员了,所以要想得到成员内部类对象,必须先要创建外围类对象
 *          在外围类对象的基础上,才能创建成员内部类对象,这是成员内部类最大的特点
 *
 *
 * 成员内部类自身的特点
 * 1，访问权限修饰符
 *     四种,普通的成员变量具有的访问权限,它都有
 *
 * 2，成员特点
 *     a.成员变量
 *        允许定义普通成员变量,但是不能定义静态成员变量.可以定义那些不会触发完整类加载的全局常量
 *
 *     b.成员方法
 *        允许定义普通成员方法,但是没有静态方法
 *
 *     c.构造器
 *        有构造器,因为有成员变量需要赋值
 *
 *     d.代码块
 *        有构造代码块,但是没有静态代码块
 *    以上,成员内部类当中和普通类没有区别,唯一的区别是没有"static"声明
 *
 * 3，继承和实现
 *      成员内部类是很少用来继承和实现的,但是它是可以的
 *      思考:
 *          能不能让一个外部类来继承成员内部类?
 *          是可以的,但是需要一定的操作(意义不大,自行了解)
 *
 */
public class Demo {
}
//外围类
class EnclosedClazz{
    //成员内部类
    private  class InnerClazz {
        //定义成员变量
        int a;
        {}
        //static {}
        private int b = 20;
        //Inner classes cannot have static declarations
        //static int c = 30;
        static final int D = 30;
        static final String E = "hello";
        //static final String F = new String("111");

        //定义成员方法
        public void test(){}
        //public static void testStatic(){}
        //public abstract void test2();


        public InnerClazz() {
        }

        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }
    }

    interface  IA{}
}
